Skip to content

feat: calculator v61 redesign & os widget#554

Open
ovitrif wants to merge 2 commits into
feat/facts-v61from
feat/calculator-widget-v61
Open

feat: calculator v61 redesign & os widget#554
ovitrif wants to merge 2 commits into
feat/facts-v61from
feat/calculator-widget-v61

Conversation

@ovitrif
Copy link
Copy Markdown
Collaborator

@ovitrif ovitrif commented May 16, 2026

Description

This PR:

  1. Refreshes the in-app Bitcoin Calculator widget with the v6.1 two-row card treatment and Bitkit number pad interaction.
  2. Adds the native iOS Home Screen Calculator widget in small and medium sizes, backed by App Group mirrored calculator values and currency settings.
  3. Adds the Calculator preview carousel and focused formatter/input coverage, including a crash fix found during simulator validation.

Mirrors the Calculator app and OS widget work from synonymdev/bitkit-android#942.

Linked Issues/Tasks

N/A

Screenshot / Video

Not attached in this pass.

QA Notes

Manual Tests

  • 1. Widgets → Bitcoin Calculator: small and wide previews render the v6.1 two-row calculator card.
  • 2. Widgets → Bitcoin Calculator → Save Widget → Home: Calculator appears in the widget list with the persisted Bitcoin and fiat values.
  • 3. Home → Calculator widget → tap Bitcoin row: Bitkit number pad opens, modern Bitcoin uses space grouping, and fiat conversion updates after number input.
  • 4. Home → Calculator widget → tap fiat row: Bitkit number pad opens, fiat grouping uses commas, one-decimal input shows the dimmed trailing zero placeholder, and Bitcoin conversion updates.
  • 5. regression: Settings → General → Default Unit → switch Modern/Classic → Home → Calculator widget: Bitcoin amount is preserved while denomination formatting changes.
  • 6. iOS Home Screen → add Bitkit Calculator small widget: two read-only rows render without trailing labels.
  • 7. iOS Home Screen → add Bitkit Calculator medium widget: two read-only rows render with Bitcoin and fiat labels.
  • 8. iOS Home Screen → tap Calculator OS widget: Bitkit opens without auto-focusing calculator input.

Automated Checks

  • Unit tests added: BitkitTests/CalculatorWidgetTests.swift covers calculator grouping, decimal placeholder behavior, number-pad delete/decimal caps, localized comma input normalization, symbol shortening, and classic BTC-to-sats conversion.
  • Local simulator validation completed on iPhone 16 Pro iOS 18.5 with the provided regtest restore path: restored wallet, opened Widgets → Bitcoin Calculator, verified preview render, saved the widget, opened the Home Calculator number pad, and confirmed 1 updated 10 000 / $6.66 to 100 001 / $66.59.
  • Runtime crash found and fixed during validation: the previous grouped formatter recursed through a private joined(separator:) helper and crashed when opening the Calculator preview; 76f4cc34 replaces it with direct left-to-right grouping.
  • Local: swiftformat passed for changed Swift files.
  • Local: node scripts/validate-translations.js passed with 0 errors.
  • Local: xcodebuild ... -only-testing:BitkitTests/CalculatorWidgetTests build-for-testing passed.
  • Local: removed the known static LDKNodeFFI.framework simulator install stub from DerivedData, then xcodebuild test-without-building ... -only-testing:BitkitTests/CalculatorWidgetTests passed with 7 tests and 0 failures.
  • Local: XcodeBuildMCP build_sim for Bitkit Debug on iPhone 16 Pro iOS 18.5 passed, including the Widget extension target; remaining warnings are pre-existing PubkyImage.swift Swift 6 async lock/unlock warnings.
  • CI: Run Tests, build-local, and build-staging passed; e2e jobs were still running when last checked.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6c2d065d16

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

CalculatorHomeScreenWidgetEntryView(entry: entry)
}
.configurationDisplayName("widgets__calculator__name")
.description("widgets__calculator__description")
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use a static calculator widget description

The home-screen widget gallery cannot perform the app's t(..., variables:) substitution here, but widgets__calculator__description is the in-app string that contains {fiatSymbol}. As a result, when users add the new Calculator OS widget from the iOS widget gallery, the description is shown with the literal {fiatSymbol} placeholder instead of a real currency symbol or generic text.

Useful? React with 👍 / 👎.

@ovitrif ovitrif marked this pull request as draft May 17, 2026 14:53
@ovitrif ovitrif changed the title feat: calculator widget v61 + OS widget feat: calculator v61 redesign & os widget May 17, 2026
@ovitrif ovitrif self-assigned this May 17, 2026
@ovitrif ovitrif added this to the 2.3.0 milestone May 17, 2026
@ovitrif ovitrif marked this pull request as ready for review May 17, 2026 17:32
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 76f4cc3403

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +103 to 105
if values.bitcoinValue.isEmpty, saved.bitcoinValue.isEmpty {
values.bitcoinValue = CalculatorWidgetValues().bitcoinValue
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve an intentionally cleared calculator amount

When the user deletes all digits from the calculator, persistValues() saves an empty bitcoinValue; on the next render this branch treats that saved empty value as uninitialized, resets it to the default 10000, and immediately persists that default again. Since load() already returns CalculatorWidgetValues() for a missing App Group value, saved.bitcoinValue.isEmpty here only represents an intentionally cleared amount, so navigating away/back or reopening the app unexpectedly changes the calculator and home-screen widget from blank/0 back to 10,000 sats.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant